import axios from 'axios'; // 引入axios
import qs from 'qs'; // 引入qs模块，用来序列化post类型的数据
import { Loading } from 'element-ui';



// 环境的切换
let loadingInstance;// 启动的Loading
let Protoco = window.location.protocol + '//';
let Host = window.location.host;
let baseUrl_app = Protoco + Host +'/smarthome/';   //app和远程:正式使用
let baseUrl_pc = 'http://home.wayclouds.com:5080/smarthome/'; //pc端：测试使用

if (process.env.NODE_ENV == 'development') {    
    axios.defaults.baseURL = baseUrl_pc;} 
else if(process.env.NODE_ENV == 'production') {    
    axios.defaults.baseURL = baseUrl_app;
}

const CancelToken = axios.CancelToken;
const source = CancelToken.source();


// 请求拦截器
axios.interceptors.request.use(    
    config => {
        // 目前没有token 只做loading的处理
        loadingInstance = Loading.service({
            lock: true,
            spinner: 'el-icon-loading',
            background: 'rgba(255, 255, 255, 0.5)'
        });
        return config;
    },
    error => {        
        // 对请求错误做些什么
        // 响应成功关闭loading
        loadingInstance.close();
        return Promise.reject(error);
    }   
)




//返回数据拦截器
axios.interceptors.response.use(    
    res => {        
        // 响应成功关闭loading
        loadingInstance.close();

        //处理一些错误
        if (res.data.code == 500) {
            // 这里的错误会被async的catch接收到
            return Promise.reject(res.data.msg);
            // Toast('系统错误');
        } else if ( res.data.code == 501 ) {
            return Promise.reject(res.data.msg);
            // Toast('数据库操作失败');
        } else if ( res.data.code == 400 ) {
            // 参数错误
            return Promise.reject(400);
        } else if ( res.data.code == 502 ) {
            return Promise.reject(502);
        } else if ( res.data.code == 405 ){
            return Promise.reject(405);
        } else{
            return res;
        }   
    },
    // 服务器状态码不是200的情况    
    error => {        
        // 这里的error会被async函数的catch捕捉到
        // 响应失败关闭loading
        loadingInstance.close();
        // Toast('网络出错');
        return Promise.reject(error);      
    }
);


//封装请求方法  promise的catch方法可以捕捉到then里的错误
function formatReq(type, url, data) {
    let date = new Date();
    let time = date.getTime();
    return new Promise((reslove, reject) => {
        axios({
            method: type,
            // url: `${baseUrl}${url}?time=${time}`,
            url: `${url}?time=${time}`,
            headers: {
                //这里的请求头与后台商量设置
                'content-Type': 'application/json; charset=UTF-8'
            },
            cancelToken: source.token,
            timeout: 15000,
            // data: qs.stringify(data) //java后台用qs转
            data:JSON.stringify(data)//PHP后台用JSON转
        })
        .then(res => {
            reslove(res);
        })
        .catch(error => {
            reject(error);
        });
    });
}

const Http = {
    get: (url, query={}) => {
        // const _url = url + utils.formatUrl(query);
        const _url = url + qs.stringify(query);
        // return axios.get(`${baseUrl}${_url}`, { cancelToken: source.token }).then(r => r);
        return axios.get(`${_url}`, { cancelToken: source.token }).then(r => r);
    },
    post: (url, data) => formatReq('post', url, data),
    put: (url, data) => formatReq('put', url, data),
    patch: (url, data) => formatReq('patch', url, data),
    delete: (url, data) => formatReq('delete', url, data)
};

export default Http;
